﻿using AuthCenter.Api.Read.Application.Command.Apply;
using AuthCenter.Api.Read.Application.Output;
using AuthCenter.Application;
using AuthCenter.Domain;
using AuthCenter.ErrorCode;
using MediatR;
using Microsoft.EntityFrameworkCore;
using Microsoft.Identity.Client;
using System.Globalization;

namespace AuthCenter.Api.Read.Application.Hander.Apply
{
    public class GetMonthlyLeaveDetailHander : IRequestHandler<GetMonthlyLeaveDetailCommand, ApiResult<List<LeaveRecordOutput>>>
    {
        private readonly IBaseRepository<ApplyModel> _applyRepository;
        // 定义工作时间范围（9:00-17:00）
  
        public GetMonthlyLeaveDetailHander(IBaseRepository<ApplyModel> applyRepository)
        {
            _applyRepository = applyRepository;
        }
        public Task<ApiResult<List<LeaveRecordOutput>>> Handle(GetMonthlyLeaveDetailCommand request, CancellationToken cancellationToken)
        {
            ApiResult<List<LeaveRecordOutput>> res = new ApiResult<List<LeaveRecordOutput>>();
            // 解析月份输入，返回当月起始和结束时间
            var (startOfMonth, endOfMonth) = ParseMonthInputToDateRange(request.Month);
            // 查询数据库（仅过滤日期，不处理时间）
            var rawleaveData = _applyRepository.GetAll()
                .Where(x => x.UserName == request.UserName && !x.IsDeleted)
                .Where(s => s.StartTime <= endOfMonth && s.EndTime >= startOfMonth) // 过滤出与当月有交集的请假记录
                .AsNoTracking().Select
                (x=>new LeaveRecordOutput 
                {
                    Id = x.Id,
                    departmentId = x.departmentId,
                    // 调整开始时间（如果早于当月第一天，则取当月第一天 9:00）
                    StartTime = x.StartTime > startOfMonth ? x.StartTime : startOfMonth,
                    EndTime = x.EndTime < endOfMonth ? x.EndTime : endOfMonth,
                    Remark =x.Remark,
                    TypeName=x.TypeName,
                    UserName = x.UserName,
                    Reason=x.Reason,
                    Hour=x.Hour,
                }
               
                ).ToList();
           
            res.Message = "获取某个人在某个月请假的数据";
            res.Code = ApiEnums.OK;
            res.Data = rawleaveData.ToList();
            return Task .FromResult(res);
        }


        private (DateTime startOfMonth, DateTime endOfMonth) ParseMonthInputToDateRange(string monthInput)
        {
            if (string.IsNullOrWhiteSpace(monthInput))
                throw new ArgumentException("月份参数不能为空");

            // 尝试解析 "yyyy-MM" 格式（如 "2023-07"）
            if (DateTime.TryParseExact(monthInput, "yyyy-MM", CultureInfo.InvariantCulture,
                                     DateTimeStyles.None, out var exactDate))
            {
                var startOfMonth = new DateTime(exactDate.Year, exactDate.Month, 1);
                return (startOfMonth, startOfMonth.AddMonths(1).AddDays(-1));
            }

            // 尝试解析 "MM" 格式（如 "07"），使用当前年份
            if (DateTime.TryParseExact(monthInput, "MM", CultureInfo.InvariantCulture,
                                     DateTimeStyles.None, out var monthDate))
            {
                var startOfMonth = new DateTime(DateTime.Now.Year, monthDate.Month, 1);
                return (startOfMonth, startOfMonth.AddMonths(1).AddDays(-1));
            }

            // 尝试解析中文或英文月份名称（如 "七月" 或 "June"）
            var monthNameFormats = new[] { "MMMM", "MMM" }; // "MMMM"=全称（七月），"MMM"=缩写（Jul）
            if (DateTime.TryParseExact(monthInput, monthNameFormats, CultureInfo.CurrentCulture,
                                     DateTimeStyles.None, out var monthNameDate))
            {
                var startOfMonth = new DateTime(DateTime.Now.Year, monthNameDate.Month, 1);
                return (startOfMonth, startOfMonth.AddMonths(1).AddDays(-1));
            }

            // 尝试解析 "M" 格式（如 "7"），补零后处理
            if (int.TryParse(monthInput, out var monthNum))
            {
                if (monthNum >= 1 && monthNum <= 12)
                {
                    var startOfMonth = new DateTime(DateTime.Now.Year, monthNum, 1);
                    return (startOfMonth, startOfMonth.AddMonths(1).AddDays(-1));
                }
            }

            throw new ArgumentException("月份格式无效。支持格式：'yyyy-MM'（如'2023-07'）、'MM'（如'07'）、'MMMM'（如'七月'）或'M'（如'7'）");
        }
    }
}
